"use strict"

process.env.NODE_ENV = "production"

const { say } = require("cfonts")
const chalk = require("chalk")
const del = require("del")
const { spawn } = require("child_process")
const webpack = require("webpack")
const Multispinner = require("multispinner")

const mainConfig = require("./webpack.main.config")
const rendererConfig = require("./webpack.renderer.config")
const webConfig = require("./webpack.web.config")

const doneLog = chalk.bgGreen.white(" DONE ") + " "
const errorLog = chalk.bgRed.white(" ERROR ") + " "
const okayLog = chalk.bgBlue.white(" OKAY ") + " "
const isCI = process.env.CI || false

if (process.env.BUILD_TARGET === "clean") clean()
else if (process.env.BUILD_TARGET === "web") web()
else build()

function clean() {
    del.sync(["build/*", "!build/icons", "!build/icons/icon.*"])
    console.log(`\n${doneLog}\n`)
    process.exit()
}

function build() {
    let starTime = new Date().getTime()
    greeting()

    del.sync(["dist/electron/*", "!.gitkeep"])

    // const tasks = ['main', 'renderer-theme', 'renderer'];
    const tasks = ["main", "renderer"]
    const m = new Multispinner(tasks, {
        preText: "building",
        postText: "process"
    })

    let results = ""

    m.on("success", () => {
        process.stdout.write("\x1B[2J\x1B[0f")
        console.log(`\n\n${results}`)
        console.log(`${okayLog}take it away ${chalk.yellow("`electron-builder`")}\n`)
        console.log(chalk.bgGreen.white(` build time: ${new Date().getTime() - starTime} `))
        process.exit()
    })

    pack(mainConfig)
        .then((result) => {
            results += result + "\n\n"
            m.success("main")

            pack(rendererConfig)
                .then((result) => {
                    results += result + "\n\n"
                    m.success("renderer")
                })
                .catch((err) => {
                    m.error("renderer")
                    console.log(`\n  ${errorLog}failed to build renderer process`)
                    console.error(`\n${err}\n`)
                    process.exit(1)
                })
        })
        .catch((err) => {
            m.error("main")
            console.log(`\n  ${errorLog}failed to build main process`)
            console.error(`\n${err}\n`)
            process.exit(1)
        })
}

function pack(config) {
    return new Promise((resolve, reject) => {
        config.mode = "production"
        webpack(config, (err, stats) => {
            if (err) reject(err.stack || err)
            else if (stats.hasErrors()) {
                let err = ""

                stats
                    .toString({
                        chunks: false,
                        colors: true
                    })
                    .split(/\r?\n/)
                    .forEach((line) => {
                        err += `    ${line}\n`
                    })

                reject(err)
            } else {
                resolve(
                    stats.toString({
                        chunks: false,
                        colors: true
                    })
                )
            }
        })
    })
}

function web() {
    del.sync(["dist/web/*", "!.gitkeep"])
    webConfig.mode = "production"
    webpack(webConfig, (err, stats) => {
        if (err || stats.hasErrors()) console.log(err)

        console.log(
            stats.toString({
                chunks: false,
                colors: true
            })
        )

        process.exit()
    })
}

function greeting() {
    const cols = process.stdout.columns
    let text = ""

    if (cols > 85) text = "lets-build"
    else if (cols > 60) text = "lets-|build"
    else text = false

    if (text && !isCI) {
        say(text, {
            colors: ["yellow"],
            font: "simple3d",
            space: false
        })
    } else console.log(chalk.yellow.bold("\n  lets-build"))
    console.log()
}
